React useFormStatus asynkron validering: Asynkrone skjema-statusoppdateringer | MLOG | MLOG

I dette eksempelet:

Forklaring

`useFormStatus`-hooken gir informasjon om den siste skjemainnsendingen. Spesifikt er `pending`-egenskapen en boolsk verdi som indikerer om skjemaet for øyeblikket sendes inn. `data`-egenskapen inneholder skjemadata, hvis tilgjengelig. `action`-egenskapen returnerer funksjonen som brukes som skjemaets handling.

Avanserte teknikker og beste praksis

1. Debouncing for forbedret ytelse

I scenarier der brukere skriver raskt, for eksempel under validering av brukernavn eller e-post, kan det være ineffektivt og potensielt overbelaste serveren din å utløse et API-kall for hvert tastetrykk. Debouncing er en teknikk for å begrense hvor ofte en funksjon blir kalt. Implementer en debouncing-funksjon for å utsette valideringen til brukeren har sluttet å skrive i en spesifisert periode.

            import React, { useState, useCallback, useTransition } from 'react';
import { useFormStatus } from 'react-dom';

function UsernameForm() {
  const [username, setUsername] = useState('');
  const [isPending, startTransition] = useTransition();

  // Debounce function
  const debounce = (func, delay) => {
    let timeoutId;
    return (...args) => {
      clearTimeout(timeoutId);
      timeoutId = setTimeout(() => {
        func(...args);
      }, delay);
    };
  };

  const debouncedHandleSubmit = useCallback(
    debounce(async (formData) => {
      "use server";
      const username = formData.get('username');

      // Simulate an API call to check username availability
      await new Promise(resolve => setTimeout(resolve, 500)); // Simulate network latency

      const isAvailable = username !== 'taken'; // Mock availability check

      if (!isAvailable) {
        throw new Error('Username is already taken.');
      }

      console.log('Username is available!');
      // Perform actual form submission here
    }, 500), // 500ms delay
    []
  );

  return (
    <form action={debouncedHandleSubmit}>
      <label htmlFor="username">Username:</label>
      <input
        type="text"
        id="username"
        name="username"
        value={username}
        onChange={(e) => setUsername(e.target.value)}
      />
      <button type="submit" disabled={isPending}>
        {isPending ? 'Checking...' : 'Submit'}
      </button>
       <StatusComponent />
    </form>
  );
}

function StatusComponent() {
    const { pending, data, method, action } = useFormStatus();

    return (
        <p>
          {pending && "Submitting..."}
          {data && <pre>{JSON.stringify(data)}</pre>}
        </p>
    )
}

export default UsernameForm;

            

I dette forbedrede eksempelet:

2. Throttling for rate-limiting

Mens debouncing forhindrer for mange API-kall innenfor en kort periode, sikrer throttling at en funksjon kalles med et jevnt intervall. Dette kan være nyttig når du trenger å utføre en validering regelmessig, men ikke ønsker å overbelaste serveren din. For eksempel, å begrense frekvensen av API-kall per minutt.

3. Optimistiske oppdateringer

Optimistiske oppdateringer forbedrer brukeropplevelsen ved å umiddelbart oppdatere brukergrensesnittet som om skjemainnsendingen var vellykket, selv før serveren bekrefter det. Dette skaper en oppfattet raskere responstid. Det er imidlertid avgjørende å håndtere potensielle feil på en elegant måte. Hvis valideringen på serversiden mislykkes, tilbakestill brukergrensesnittet til sin forrige tilstand og vis en feilmelding.

4. Feilhåndtering og tilbakemelding til brukeren

Gi klare og informative feilmeldinger til brukeren når valideringen mislykkes. Indiker hvilket felt(er) som forårsaket feilen og foreslå korrigerende tiltak. Vurder å vise feilmeldinger inline, nær de relevante inputfeltene, for bedre synlighet.

5. Hensyn til tilgjengelighet

Sørg for at skjemaene dine er tilgjengelige for brukere med nedsatt funksjonsevne. Bruk passende ARIA-attributter for å gi semantisk informasjon om skjemaelementer og deres tilstander. For eksempel, bruk aria-invalid for å indikere ugyldige inputfelt og aria-describedby for å koble feilmeldinger til de tilsvarende feltene.

6. Internasjonalisering (i18n)

Når du utvikler skjemaer for et globalt publikum, bør du vurdere internasjonalisering. Bruk et bibliotek som i18next eller React Intl for å tilby oversatte feilmeldinger og tilpasse skjemaets layout til forskjellige språk og kulturelle konvensjoner. For eksempel varierer datoformater og adressefelt mellom land.

7. Beste praksis for sikkerhet

Utfør alltid validering på serversiden i tillegg til validering på klientsiden. Validering på klientsiden er primært for brukeropplevelsen og kan omgås. Validering på serversiden beskytter applikasjonen din mot ondsinnet input og sikrer dataintegritet. Saniter brukerinput for å forhindre cross-site scripting (XSS)-angrep og andre sikkerhetssårbarheter. Bruk også en Content Security Policy (CSP) for å beskytte mot XSS-angrep.

8. Håndtering av ulike metoder for skjemainnsending

useFormStatus-hooken fungerer bra med både GET- og POST-metoder. `method`-egenskapen til det returnerte objektet vil inneholde HTTP-metoden som ble brukt til å sende inn skjemaet. Sørg for at din logikk på serversiden håndterer begge metodene på riktig måte. GET-forespørsler brukes vanligvis for enkel datahenting, mens POST-forespørsler brukes for å opprette eller endre data.

9. Integrasjon med skjemabiblioteker

Selv om useFormStatus gir en grunnleggende mekanisme for å håndtere statusen for skjemainnsending, kan du integrere den med mer omfattende skjemabiblioteker som Formik, React Hook Form eller Final Form. Disse bibliotekene tilbyr avanserte funksjoner som tilstandshåndtering for skjemaer, valideringsregler og feilhåndtering på feltnivå. Bruk useFormStatus for å forbedre brukeropplevelsen under asynkron validering i disse bibliotekene.

10. Testing av asynkron validering

Skriv enhetstester for å verifisere at logikken for asynkron validering fungerer korrekt. Mock API-kallene ved hjelp av biblioteker som Jest og Mock Service Worker (MSW). Test både vellykkede og feil-scenarier for å sikre at skjemaet ditt håndterer alle tilfeller elegant. Test også tilgjengelighetsfunksjonene i skjemaene dine for å sikre at de kan brukes av personer med nedsatt funksjonsevne.

Eksempler fra den virkelige verden

La oss se på hvordan asynkron validering brukes i ulike virkelige scenarier globalt:

Konklusjon

Asynkron validering er en uunnværlig teknikk for å lage robuste og brukervennlige skjemaer i React. Ved å utnytte useFormStatus, debouncing, throttling og andre avanserte teknikker kan du gi sanntidstilbakemelding til brukere, forhindre feil og forbedre den totale opplevelsen av skjemainnsending. Husk å prioritere tilgjengelighet, sikkerhet og internasjonalisering for å lage skjemaer som er brukbare for alle, overalt. Test og overvåk skjemaene dine kontinuerlig for å sikre at de møter de skiftende behovene til brukerne dine og kravene til applikasjonen din.